from flask import Flask, redirect
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy
from flask_jwt_extended import JWTManager
from datetime import datetime
from config import config

# 创建Flask应用的工厂函数
def create_app(config_name='default'):
    # 创建Flask应用实例
    app = Flask(__name__)
    
    # 加载配置
    app.config.from_object(config[config_name])
    
    # 设置JWT密钥
    app.config['JWT_SECRET_KEY'] = 'your-secret-key-here'  # 在生产环境中应使用环境变量
    
    # 初始化JWTManager
    jwt = JWTManager(app)
    
    # 初始化CORS，允许所有来源的跨域请求并支持凭证
    CORS(app, resources={r"/*": {"origins": "*", "supports_credentials": True}})
    
    # 在当前应用上下文中初始化数据库
    db = SQLAlchemy(app)
    
    # 定义模型（内联定义以避免导入问题）
    class User(db.Model):
        __table_args__ = {'extend_existing': True}
        id = db.Column(db.Integer, primary_key=True)
        phone = db.Column(db.String(20), unique=True, nullable=False)
        openid = db.Column(db.String(100), unique=True, nullable=True)
        nickname = db.Column(db.String(50), nullable=True)
        avatar = db.Column(db.String(200), nullable=True)
        password = db.Column(db.String(200), nullable=True)  # 管理员密码
        is_admin = db.Column(db.Boolean, default=False)  # 是否为管理员
        admin_level = db.Column(db.Integer, default=0)  # 管理员级别：0-非管理员，1-普通管理员，2-超级管理员
        created_at = db.Column(db.DateTime, default=db.func.now())
        updated_at = db.Column(db.DateTime, default=db.func.now(), onupdate=db.func.now())
        assessments = db.relationship('Assessment', backref='user', lazy=True)
    
    class Article(db.Model):
        __table_args__ = {'extend_existing': True}
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(100), nullable=False)
        summary = db.Column(db.String(500), nullable=False)
        content = db.Column(db.Text, nullable=False)
        cover_image = db.Column(db.String(200), nullable=True)
        publish_date = db.Column(db.String(20), nullable=False)
        created_at = db.Column(db.DateTime, default=db.func.now())
        updated_at = db.Column(db.DateTime, default=db.func.now(), onupdate=db.func.now())
    
    class Banner(db.Model):
        __table_args__ = {'extend_existing': True}
        id = db.Column(db.Integer, primary_key=True)
        image_url = db.Column(db.String(200), nullable=False)
        link = db.Column(db.String(200), nullable=False)
        order = db.Column(db.Integer, default=0)
        created_at = db.Column(db.DateTime, default=db.func.now())
        updated_at = db.Column(db.DateTime, default=db.func.now(), onupdate=db.func.now())
    
    class Assessment(db.Model):
        __table_args__ = {'extend_existing': True}
        id = db.Column(db.Integer, primary_key=True)
        user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=True)
        assessment_type = db.Column(db.String(20), nullable=False)
        eyelid_sign = db.Column(db.String(100), nullable=True)
        right_eye_protrusion = db.Column(db.Float, nullable=True)
        left_eye_protrusion = db.Column(db.Float, nullable=True)
        eye_movement = db.Column(db.String(100), nullable=True)
        photo_path = db.Column(db.String(200), nullable=True)
        status = db.Column(db.String(20), default='completed')
        created_at = db.Column(db.DateTime, default=db.func.now())
        updated_at = db.Column(db.DateTime, default=db.func.now(), onupdate=db.func.now())
    
    # 在应用上下文中执行数据库操作
    with app.app_context():
        # 创建数据库表
        db.create_all()
        
        # 添加一些测试数据（仅在数据库为空时）
        
        # 检查是否已有用户数据
        if User.query.count() == 0:
            # 创建测试用户
            test_user = User(phone='13800138000', openid='test_openid')
            db.session.add(test_user)
            db.session.commit()
            print('Test user created')
            
        # 检查是否已有文章数据
        if Article.query.count() == 0:
            # 创建测试文章
            articles = [
                Article(
                    title='科学解读：突眼症与甲状腺疾病的关系',
                    summary='最新研究表明，80%以上的突眼症患者都伴有不同程度的甲状腺功能异常...',
                    content='突眼症（Graves眼病）是一种自身免疫性疾病，与甲状腺功能亢进密切相关。本文将深入探讨两者之间的关系...',
                    cover_image='/images/banner3.png',
                    publish_date='2023-06-28'
                ),
                Article(
                    title='突眼症的早期症状与预防',
                    summary='突眼症是一种常见的眼科疾病，早期发现和预防非常重要...',
                    content='突眼症的早期症状包括：眼睛干涩、畏光、流泪、视力模糊等。本文将介绍如何早期发现和预防突眼症...',
                    cover_image='/images/article1.png',
                    publish_date='2023-06-15'
                ),
                Article(
                    title='如何正确保护你的眼睛健康',
                    summary='日常生活中，我们应该如何正确保护眼睛，避免眼部疾病...',
                    content='眼睛是人体最重要的感官器官之一，正确保护眼睛健康至关重要。本文将介绍一些实用的护眼方法...',
                    cover_image='/images/article2.png',
                    publish_date='2023-06-10'
                )
            ]
            db.session.add_all(articles)
            db.session.commit()
            print('Test articles created')
            
        # 检查是否已有轮播图数据
        if Banner.query.count() == 0:
            # 创建测试轮播图
            banners = [
                Banner(image_url='/images/banner1.png', link='/pages/science/science'),
                Banner(image_url='/images/banner2.png', link='/pages/eyeHealth/eyeHealth'),
                Banner(image_url='/images/banner3.png', link='/pages/thyroidQuestionnaire/thyroidQuestionnaire')
            ]
            db.session.add_all(banners)
            db.session.commit()
            print('Test banners created')
    
    # 为API模块提供全局可访问的db和模型引用
    app.db = db
    app.User = User
    app.Article = Article
    app.Banner = Banner
    app.Assessment = Assessment
    
    # 延迟导入API蓝图，确保db和模型已经定义
    import sys
    import os
    sys.path.append(os.path.dirname(os.path.abspath(__file__)))
    from apis import api_bp
    app.register_blueprint(api_bp, url_prefix='/api')
    
    # 添加管理后台路由
    @app.route('/admin')
    @app.route('/admin/')
    def admin_index():
        """重定向到管理后台主页"""
        return redirect('/admin/index.html')
    
    # 添加管理后台静态文件服务
    import os
    from flask import send_from_directory
    
    @app.route('/admin/<path:filename>')
    def admin_static(filename):
        """提供管理后台静态文件服务"""
        admin_frontend_dir = os.path.join(os.path.dirname(__file__), 'admin_frontend')
        return send_from_directory(admin_frontend_dir, filename)
    
    # 添加uploads路径的静态文件服务
    @app.route('/uploads/<path:filename>')
    def uploads_static(filename):
        """提供上传文件的静态文件服务"""
        uploads_dir = os.path.join(os.path.dirname(__file__), 'uploads')
        return send_from_directory(uploads_dir, filename)
    
    return app

# 为了方便在开发环境中直接运行
if __name__ == '__main__':
    app = create_app()
    app.run(host='0.0.0.0', port=5000, debug=True)